// 发布者 Publisher
class Publisher {
  constructor() {
    // 订阅者 依赖存储器 初始化
    this.observers = [];
    console.log("Publisher created");
  }

  // 增加订阅者
  add(observer) {
    console.log("observer ===> ", observer);
    this.observers.push(observer);
  }

  // 删除订阅者
  remove(observer) {
    const eq = this.observers.findIndex(observer);
    if (eq) {
      this.observers.splice(eq, 1);
    }
  }

  // 通知订阅者更新
  notify() {
    this.observers.forEach((item) => {
      item?.update(this);
    });
  }
}

// 订阅者 Observer
class Observer {
  constructor() {
    console.log("订阅者 创建了");
  }

  update() {
    console.log("更新");
  }
}

// 实例 ===>
// 产品经理 告诉 程序员（前端程序员、后端程序员）这周有任务要开发，你们注意我发布的需求文档
// 发布者 产品经理发布需求文档
class PrdPublish extends Publisher {
  constructor() {
    // 执行继承类的构造函数
    super();
    // 初始化需求文档 默认是没有
    this.prdState = null;
    // 订阅者列表 存起来用于通知
    this.observers = [];
  }

  // 获取当前的 prdState
  getPrd() {
    return this.prdState;
  }

  // 修改当前的 prdState
  setPrd(v) {
    this.prdState = v;
    this.notify();
  }
}

// 订阅者
class DeveloperObserver extends Observer {
  constructor(type) {
    super();
    // 职位
    this.type = type;
    // 需求文档一开始还不存在，prd初始为空对象
    this.prdState = null;
  }

  // 重写update
  update(Publisher) {
    // 更新需求文档
    this.prdState = Publisher.getPrd();
    // 其他逻辑
    this.work();
  }

  // 工作
  work() {
    console.log(`${this.type} 开始工作`);
  }
}
// 待命的三个成员
const web = new DeveloperObserver("前端开发工程师");
const java = new DeveloperObserver("JAVA开发工程师");
const ui = new DeveloperObserver("UI开发工程师");
// 产品经理
const pm = new PrdPublish();
// 产品经理创建微信群 拉取三个人
pm.add(web);
pm.add(java);
pm.add(ui);
// 产品经理开始修改需求文档
pm.setPrd({
  name: "测试修复最终版",
  dataTimer: "截至到周末",
  team: "前端，后端，UI",
});
